<?php

class EvaluationController extends Zend_Controller_Action
{

    public function init()
    {
        session_start("login");
    }

    public function indexAction()
    {
        /* Inicia Instancias de banco */
        $dbCompany = new Application_Model_DbTable_Company();
        $dbEvaluation = new Application_Model_DbTable_Evaluation();
        $dbCategory = new Application_Model_DbTable_Category();
        
        /* Pagination */
        $rowset = $dbCompany->fetchAll("active = 1 AND deleted = 0");
        $rowCount = count($rowset);
        $numPages = ceil($rowCount/20);
        $this->view->pages = $numPages;
        $parametros = $this->getAllParams();
        if (isset($parametros['page']) && ($parametros['page'] > 0)) {
            if (($parametros['page'] <= $numPages)) {
                $page = ($parametros['page'] - 1) * 20;
                $this->view->pageAtual = $parametros['page'];
            } else {
                $page = ($numPages - 1) * 20;
                $this->view->pageAtual = $parametros['page'];
            }
            
        } else {
            $page = 0;
            $this->view->pageAtual = 1;
        }
        
        /*  Manipula os filtros  */
        if (isset($_GET['cat'])) {
            $q = $_GET['q'];
            $loc = $_GET['loc'];
            $cat = $_GET['cat'];
            $getLocation = $dbEvaluation->fetchAll(
                $dbEvaluation->select('company_id')
                      ->where('active = ?', '1')
                       ->where('location LIKE "%'.$loc.'%"')
            );
            if ($getLocation->count() <= 0) {
                $locFilter[] = 0;
            }else{
                foreach ($getLocation AS $val) {
                    $locFilter[] = $val['company_id'];
                }
            }
            if ($cat == 'all') {
                $filter = $dbCompany->select('id, name, logo, category_id, friendly_name')
                                ->where('active = ?', '1')
                                ->where('deleted = ?', '0')
                                ->where('name LIKE "%'.$q.'%"')
                                ->where('id IN(?)', $locFilter)
                                ->limit(20, $page);
            } else {
                $filter = $dbCompany->select('id, name, logo, category_id, friendly_name')
                                ->where('active = ?', '1')
                                ->where('deleted = ?', '0')
                                ->where('category_id = ?', $cat)
                                ->where('name LIKE "%'.$q.'%"')
                                ->where('id IN(?)', $locFilter)
                                ->limit(20, $page);
            }
        } else {
            $filter = $dbCompany->select('id, name, logo, category_id, friendly_name')
                                ->where('active = ?', '1')
                                ->where('deleted = ?', '0')
                                ->limit(20, $page);
        }
            
            
                    
        /* Busca as empresas */
        $companiesResult = $dbCompany->fetchAll($filter);
        
        /* Busca as categorias */
        $categoriesResult = $dbCategory->fetchAll(
            $dbCategory->select('id, name')
        );
        foreach ($categoriesResult as $key => $value) {
            $categories[$value['id']] = $value['name'];
        }
        $this->view->categories = $categories;
        
        /* Constroi o array de empresas  */
        $companies = array();
        foreach ($companiesResult as $company) {
            $companyItem['id'] = $company['id'];
            $companyItem['name'] = $company['name'];
            $companyItem['logo'] = $company['logo'];
            $companyItem['friendly_name'] = $company['friendly_name'];
            $companyItem['category'] = $categories[$company['category_id']];
            /* Carrega Avaliações */
            $evals = $dbEvaluation->fetchAll(
                $dbEvaluation->select()
                      ->where('active = ?', '1')
                      ->where('deleted = ?', '0')
                      ->where('company_id = ?', $company['id'])
            );
            
            /* Quantidade Avaliações */
            $companyItem['evaluations'] = $evals->count();
            
            /* Nota Média de Avaliações */
            $acNotas = array(); //acumulador de notas geral
            foreach ($evals as $eval) {
                $sum = 0;
                $sum = $sum + $eval['strategy'];
                $sum = $sum + $eval['leadership'];
                $sum = $sum + $eval['culture'];
                $sum = $sum + $eval['opportunity'];
                $sum = $sum + $eval['recognition'];
                $sum = $sum + $eval['workspace'];
                $sum = $sum + $eval['payment'];
                $sum = $sum + $eval['flexibility'];
                $sum = $sum + $eval['workoverload'];
                $sum = $sum + $eval['coworkers'];
                $sum = $sum + $eval['salary'];
                $acNotas[] = $sum/11;
            }
            $companyItem['star_rate'] = round((array_sum($acNotas) / count($acNotas)), 2);
            
            /* Add to Companies  */
            $companies[] = $companyItem;
        }
        $this->view->companies = $companies;
    }
    
    private function sendMail()
    {
        $settings = array('ssl'=>'ssl',
                        'port'=>465,
                        'auth' => 'login',
                        'username' => 'jobsel.messenger@gmail.com',
                        'password' => 'M3ns4g3ir0');
        $transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $settings);
        
        $mail = new Zend_Mail('UTF-8');
        $mail->setReplyTo('contato@jobsel.com.br', 'Jobsel');
        $mail->setFrom ('jobsel.messenger@gmail.com', 'Jobsel');
        $mail->addTo ("contato@jobsel.mobi", "Jobsel");
        $mail->addCc("mauricio.baumjr@gmail.com", "Mauricio");
        $mail->addCc("cla.cgw@gmail.com", "Claiton");
        /* Customizar dependendo da Ação  */
        $mail->setSubject ('Jobsel tem 1 nova avaliação aguardando moderação');
        $mail->setBodyHtml('Olá! <br /> Temos uma nova avaliação aguardando a moderação!');
        $mail->send($transport);
    }
    
    private function fileUpload($company) 
    {
        // Pasta onde o arquivo vai ser salvo
        $_UP['pasta'] = APPLICATION_PATH . '/../public/uploads/';
        
        // Tamanho máximo do arquivo (em Bytes)
        $_UP['tamanho'] = 1024 * 1024 * 2; // 2Mb

        // Array com as extensões permitidas
        $_UP['extensoes'] = array('jpg', 'png', 'gif');

        // Renomeia o arquivo? (Se true, o arquivo será salvo como .jpg e um nome único)
        $_UP['renomeia'] = true;

        // Array com os tipos de erros de upload do PHP
        $_UP['erros'][0] = 'Não houve erro';
        $_UP['erros'][1] = 'O arquivo no upload é maior do que o limite do PHP';
        $_UP['erros'][2] = 'O arquivo ultrapassa o limite de tamanho especifiado no HTML';
        $_UP['erros'][3] = 'O upload do arquivo foi feito parcialmente';
        $_UP['erros'][4] = 'Não foi feito o upload do arquivo';

        // Verifica se houve algum erro com o upload. Se sim, exibe a mensagem do erro
        if ($_FILES['logo']['error'] != 0) {
            //die("Não foi possível fazer o upload, erro:<br />" . $_UP['erros'][$_FILES['arquivo']['error']]);
            //exit; // Para a execução do script
            return array('success' => false, 'message' => "Não foi possível fazer o upload, erro:<br />" . $_UP['erros'][$_FILES['arquivo']['error']]);
        }

        // Faz a verificação da extensão do arquivo
        $extensao = strtolower(end(explode('.', $_FILES['logo']['name'])));
        if (array_search($extensao, $_UP['extensoes']) === false) {
            //echo "Por favor, envie arquivos com as seguintes extensões: jpg, png ou gif";
            return array('success' => false, 'message' => "Por favor, envie arquivos com as seguintes extensões: jpg, png ou gif");
        }

        // Faz a verificação do tamanho do arquivo
        else if ($_UP['tamanho'] < $_FILES['logo']['size']) {
            //echo "O arquivo enviado é muito grande, envie arquivos de até 2Mb.";
            return array('success' => false, 'message' => "O arquivo enviado é muito grande, envie arquivos de até 2Mb.");
        }

        // O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta
        else {
        // Primeiro verifica se deve trocar o nome do arquivo
            if ($_UP['renomeia'] == true) {
                // Cria um nome baseado no UNIX TIMESTAMP atual e com extensão .jpg
                $nome_final = time().'-'.$company.'.jpg';
                //$nome_final = $company.'.jpg';
            } else {
                // Mantém o nome original do arquivo
                $nome_final = $_FILES['logo']['name'];
            }

            // Depois verifica se é possível mover o arquivo para a pasta escolhida
            if (move_uploaded_file($_FILES['logo']['tmp_name'], $_UP['pasta'] . $nome_final)) {
                // Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo
                //echo "Upload efetuado com sucesso!";
                //echo '<br /><a href="' . $_UP['pasta'] . $nome_final . '">Clique aqui para acessar o arquivo</a>';
                return array('success' => true, 'message' => $nome_final);
            } else {
                // Não foi possível fazer o upload, provavelmente a pasta está incorreta
                //echo "Não foi possível enviar o arquivo, tente novamente";
                return array('success' => false, 'message' => "Não foi possível enviar o arquivo, tente novamente");
            }

        }
    }

    public function createAction()
    {
        if (!isset($_SESSION["login_id"])) {
            $_SESSION["message_success"] = "Deslogado com sucesso.";
            $this->_helper->redirector('index','login');
        }
        switch ($_POST['kind']) {
            case 'company':
                $dbTable = new Application_Model_DbTable_Company();
                if ($_FILES['logo']['size'] > 0) {
                    $upload = $this->fileUpload($_POST['name']);
                    $img = '/uploads/'.$upload['message'];
                } else {
                    $img = '';
                }
                $friendlyname = str_replace(' ', '-', strtolower($_POST['name']));
                $newCompany = array(
                    'name' => $_POST['name'],
                    'friendly_name' => $friendlyname,
                    'size' => $_POST['size'],
                    'site' => $_POST['site'],
                    'description' => $_POST['description'],
                    'user_id' => $_SESSION["login_id"],
                    'logo' => $img,
                    'active' => false,
                    'category_id' => $_POST['category']
                );
                $insert = $dbTable->insert($newCompany);
                $_SESSION["message_success"] = "A empresa foi cadastrada e será publicada após aprovação dos moderadores.";
                $this->_helper->redirector('avaliar','evaluation','',array('company' => $friendlyname));
                break;
            case 'evaluation':
                $dbTable = new Application_Model_DbTable_Evaluation();
                $newEvaluation = array(
                    'company_id' => $_POST["company"],
                    'location' => $_POST["location"],
                    'function' => $_POST["function"],
                    'age' => $_POST["age"],
                    'gender' => $_POST["gender"],
                    'strategy' => $_POST["strategy"],
                    'leadership' => $_POST["leadership"],
                    'culture' => $_POST["culture"],
                    'opportunity' => $_POST["opportunity"],
                    'recognition' => $_POST["recognition"],
                    'workspace' => $_POST["workspace"],
                    'payment' => $_POST["payment"],
                    'salary' => $_POST["salary"],
                    'flexibility' => $_POST["flexibility"],
                    'workoverload' => $_POST["workoverload"],
                    'coworkers' => $_POST["coworkers"],
                    'recomend' => $_POST["recomend"],
                    'opinion' => $_POST["opinion"],
                    'advice' => $_POST["advice"],
                    'area' => $_POST["area"],
                    'actual' => $_POST["actual"],
                    'year' => $_POST["year"],
                    'user_id' => $_SESSION["login_id"],
                    'active' => false,
                );
                $insert = $dbTable->insert($newEvaluation);
                $this->sendMail();
                $_SESSION["message_success"] = "Sua avaliação foi cadastrada e será publicada após aprovação dos moderadores.";
                $this->_helper->redirector('detalhes','evaluation','',array('company' => $_POST['friendly_name']));
                break;
        }
    }

    public function detalhesAction()
    {
        /* Databases */
        $dbCompany = new Application_Model_DbTable_Company();
        $dbEvaluation = new Application_Model_DbTable_Evaluation();
        $dbCategory = new Application_Model_DbTable_Category();
        
        /* Empresa atual  */
        $parametros = $this->getAllParams();
        $filter = $dbCompany->select('id, name, logo, category_id, friendly_name')
                            ->where('friendly_name = ?', $parametros['company'])
                            ->where('active = ?', '1')
                            ->where('deleted = ?', '0')
                            ->limit(1);
        /* Busca as empresas */
        $companyResult = $dbCompany->fetchAll($filter);
        
        /* Controla Anti Empresas Inativas ou Inexistentes */
        if ($companyResult->count() <= 0) {
            $_SESSION["message_warning"] = "A empresa que você está tentando acessar não existe ou está inativa no momento.";
            $this->_helper->redirector('index','evaluation');
        }
        
        /* Busca as categorias */
        $categoriesResult = $dbCategory->fetchAll(
            $dbCategory->select('id, name')
        );
        foreach ($categoriesResult as $key => $value) {
            $categories[$value['id']] = $value['name'];
        }
                
        /* Dados Basicos da Empresa  */
        $company['id'] = $companyResult[0]['id'];
        $company['name'] = $companyResult[0]['name'];
        $company['logo'] = $companyResult[0]['logo'];
        $company['size'] = $companyResult[0]['size'];
        $company['category'] = $categories[$companyResult[0]['category_id']];
        $company['description'] = $companyResult[0]['description'];
        $company['site'] = str_replace('https://', '', (str_replace('http://', '', $companyResult[0]['site'])));
        $company['friendly_name'] = $companyResult[0]['friendly_name'];
        
        /*  Evaluations  */
        $company['evaluations'] = array();
        $evals = $dbEvaluation->fetchAll(
            $dbEvaluation->select()
                         ->where('active = ?', '1')
                         ->where('deleted = ?', '0')
                         ->where('company_id = ?', $company['id'])
        );
        $companyAcc = array(); //acumulador para calculo de star rate
        foreach ($evals as $eval) {
            $evaluation['id'] = $eval['id'];
            $evaluation['location'] = $eval['location'];
            $evaluation['function'] = $eval['function'];
            $evaluation['age'] = $eval['age'];
            $evaluation['gender'] = $eval['gender'];
            $evaluation['actual'] = $eval['actual'];
            $evaluation['strategy'] = $eval['strategy'];
            $companyAcc['strategy'][] = $eval['strategy'];
            $evaluation['leadership'] = $eval['leadership'];
            $companyAcc['leadership'][] = $eval['leadership'];
            $evaluation['culture'] = $eval['culture'];
            $companyAcc['culture'][] = $eval['culture'];
            $evaluation['opportunity'] = $eval['opportunity'];
            $companyAcc['opportunity'][] = $eval['opportunity'];
            $evaluation['recognition'] = $eval['recognition'];
            $companyAcc['recognition'][] = $eval['recognition'];
            $evaluation['workspace'] = $eval['workspace'];
            $companyAcc['workspace'][] = $eval['workspace'];
            $evaluation['payment'] = $eval['payment'];
            $companyAcc['payment'][] = $eval['payment'];
            $evaluation['salary'] = $eval['salary'];
            $companyAcc['salary'][] = $eval['salary'];
            $evaluation['flexibility'] = $eval['flexibility'];
            $companyAcc['flexibility'][] = $eval['flexibility'];
            $evaluation['workoverload'] = $eval['workoverload'];
            $companyAcc['workoverload'][] = $eval['workoverload'];
            $evaluation['coworkers'] = $eval['coworkers'];
            $companyAcc['coworkers'][] = $eval['coworkers'];
            $evaluation['recomend'] = $eval['recomend'];
            $evaluation['opinion'] = $eval['opinion'];
            $evaluation['year'] = $eval['year'];
            $evaluation['area'] = $eval['area'];
            $evaluation['date'] = $eval['created_at'];
                    
            /* Nota Média de Avaliações */
            $sum = 0;
            $sum = $sum + $eval['strategy'];
            $sum = $sum + $eval['leadership'];
            $sum = $sum + $eval['culture'];
            $sum = $sum + $eval['opportunity'];
            $sum = $sum + $eval['recognition'];
            $sum = $sum + $eval['workspace'];
            $sum = $sum + $eval['payment'];
            $sum = $sum + $eval['flexibility'];
            $sum = $sum + $eval['workoverload'];
            $sum = $sum + $eval['coworkers'];
            $sum = $sum + $eval['salary'];
            $evaluation['star_rate'] = round(($sum/11), 2);
            $companyAcc['general'][] = $evaluation['star_rate'];
            
            /* Add to Companies  */
            $company['evaluations'][] = $evaluation;
        }
        
        /* Generates Stars Rating */
        $company['star_rate'] = round((array_sum($companyAcc['general']) / count($companyAcc['general'])), 2);
        $company['strategy'] = round((array_sum($companyAcc['strategy']) / count($companyAcc['strategy'])), 2);
        $company['leadership'] = round((array_sum($companyAcc['leadership']) / count($companyAcc['leadership'])), 2);
        $company['culture'] = round((array_sum($companyAcc['culture']) / count($companyAcc['culture'])), 2);
        $company['opportunity'] = round((array_sum($companyAcc['opportunity']) / count($companyAcc['opportunity'])), 2);
        $company['recognition'] = round((array_sum($companyAcc['recognition']) / count($companyAcc['recognition'])), 2);
        $company['workspace'] = round((array_sum($companyAcc['workspace']) / count($companyAcc['workspace'])), 2);
        $company['payment'] = round((array_sum($companyAcc['payment']) / count($companyAcc['payment'])), 2);
        $company['salary'] = round((array_sum($companyAcc['salary']) / count($companyAcc['salary'])), 2);
        $company['flexibility'] = round((array_sum($companyAcc['flexibility']) / count($companyAcc['flexibility'])), 2);
        $company['workoverload'] = round((array_sum($companyAcc['workoverload']) / count($companyAcc['workoverload'])), 2);
        $company['coworkers'] = round((array_sum($companyAcc['coworkers']) / count($companyAcc['coworkers'])), 2);
        
        $this->view->company = $company;
    }

    public function avaliarAction()
    {
        $parametros = $this->getAllParams();
        if (!isset($parametros['company'])) {
            $this->_helper->redirector('index','evaluation');
        } else {
            if (!isset($_SESSION["login_id"])) {
                $_SESSION["message_warning"] = "É necessário estar logado para fazer uma avaliação.";
                $_SESSION["redirect_to"] = $parametros['company'];
                $this->_helper->redirector('index','login');
            }
            /* Databases */
            $dbCompany = new Application_Model_DbTable_Company();
            /* Empresa atual  */
            $filter = $dbCompany->select('id, name, friendly_name')
                            ->where('friendly_name = ?', $parametros['company'])
                            ->limit(1);
        /* Busca as empresas */
        $companyResult = $dbCompany->fetchRow($filter);
        $this->view->company_id = $companyResult['id'];
        $this->view->company_name = $companyResult['name'];
        $this->view->friendly_name = $companyResult['friendly_name'];
        }
        
    }

    public function novaEmpresaAction()
    {
        if (!isset($_SESSION["login_id"])) {
            $_SESSION["message_warning"] = "É necessário estar logado para cadastrar uma nova empresa.";
            $_SESSION["redirect_to"] = "empresa";
            $this->_helper->redirector('index','login');
        }
        $dbCategory = new Application_Model_DbTable_Category();
        /* Busca as categorias */
        $categoriesResult = $dbCategory->fetchAll(
            $dbCategory->select('id, name')
        );
        foreach ($categoriesResult as $key => $value) {
            $categories[$value['id']] = $value['name'];
        }
        $this->view->categories = $categories;
    }


}